//package org.halk.util.pdf;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.github.abel533.echarts.Grid;
//import com.github.abel533.echarts.axis.AxisLabel;
//import com.github.abel533.echarts.axis.CategoryAxis;
//import com.github.abel533.echarts.axis.ValueAxis;
//import com.github.abel533.echarts.json.GsonOption;
//import com.github.abel533.echarts.series.Bar;
//import com.google.common.collect.Lists;
//import com.iflytek.biims.feedback.entity.TemplateConfig;
//import com.iflytek.biims.feedback.entity.TemplateEntity;
//import com.iflytek.biims.feedback.exception.FeedbackExceptions;
//import com.iflytek.biims.feedback.web.vm.ElectroicUseVM;
//import com.iflytek.biims.feedback.web.vm.MriTextVM;
//import com.iflytek.bp.common.exception.BpException;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.pdfbox.multipdf.PDFMergerUtility;
//import org.apache.pdfbox.pdmodel.PDDocument;
//import org.springframework.context.ApplicationContext;
//import org.springframework.core.task.TaskExecutor;
//import org.springframework.util.CollectionUtils;
//import org.thymeleaf.TemplateEngine;
//import org.thymeleaf.context.Context;
//
//import java.io.File;
//import java.io.IOException;
//import java.lang.reflect.Constructor;
//import java.time.LocalDate;
//import java.time.format.DateTimeFormatter;
//import java.util.*;
//import java.util.concurrent.CompletableFuture;
//import java.util.stream.Collectors;
//
//@Slf4j
//public class ReportPdf {
//    private static TemplateEngine templateEngine;
//
//    private static TaskExecutor taskExecutor;
//
//    public static void setApplicationContext(ApplicationContext applicationContext){
//        templateEngine = applicationContext.getBean(TemplateEngine.class);
//        taskExecutor = (TaskExecutor) applicationContext.getBean("taskExecutor");
//    }
//
//    private int grade;
//
//    private String pdfRootPath;
//
//    /**
//     * 脑图路径前缀
//     */
//    private String prefixPath;
//    /**
//     * 报告的内容
//     */
//    private TemplateEntity templateEntity;
//
//    private static final String MRI_RESULT_ABSTRACT = "结果摘要";
//    private static final String MRI_RESULT_VIEW = "磁共振扫描情况-磁共振扫描阅片结果";
//    private static final String MRI_RESULT_BRAIN = "磁共振扫描情况-磁共振扫描大脑皮层机构图";
//    private static final String COGNITION_STUDY = "CognitionStudy"; // 认知与学习
//    private static final String EMOTION_SOCIAL_ADAPT = "EmotionsSocialAdapt"; // 情绪与社会适应
//    private static final String CONCAT = "//";
//    private static final String PDF_SUFFIX = ".pdf";
//    private static final String[] TEST_IDS = {"space-work","episodic-memory","performing-function","word-count","sentence-understand","read-fluency",
//                                                "application-problem-solving","concept-understand","math-operation","letter-naming","english-orthographic"};
//    private static final Map<String,String> colorMap = new HashMap<>();
//    private static Map<String, TemplateEntity.ScoreEntity> scoreEntityMap = new HashMap<>();
//    private static Map<String, String> tipMap = new HashMap<>();
//    private static Map<String,String> electroicDeviceUseMap = new HashMap<>();
//
//    static {
//        colorMap.put("A","#53C53F");
//        colorMap.put("B","#F99444");
//        colorMap.put("C","#FCCC57");
//        colorMap.put("D","#FF5454");
//    }
//
//    public ReportPdf(String prefixPath,TemplateEntity templateEntity,int grade,String pdfRootPath){
//        this.prefixPath = prefixPath;
//        this.templateEntity = templateEntity;
//        this.grade = grade;
//        this.pdfRootPath = pdfRootPath + CONCAT + templateEntity.getSubjectId();
//    }
//
//
//
//    @FunctionalInterface
//    public interface PageImpl {
//         void generate() throws IOException;
//    }
//
//    public class Page1 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"1.pdf";
//            Context context = new Context();
//            context.setVariable("siteName", templateEntity.getSiteName());
//            context.setVariable("subjectName", templateEntity.getSubjectName());
//            context.setVariable("subjectId", templateEntity.getSubjectId());
//            context.setVariable("time", templateEntity.getTime());
//            String htmlStr = templateEngine.process("pages/page1/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//
//    public class Page2 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"2.pdf";
//            Context context = new Context();
//            String defaultCover = "[{'label': '报告导读', 'page': 2}, {'label': '结果摘要', 'page': 4, 'children': [{'label': '1.  磁共振扫描情况', 'page': 4}, {'label': '2.  认知行为与环境情况', 'page': 4}]}, {'label': '第一部分、磁共振扫描情况', 'page': 6}, {'label': '第二部分、认知与学习', 'page': 8, 'children': [{'label': '1.  空间工作记忆', 'page': 9}, {'label': '2.  情景记忆', 'page': 10}, {'label': '3.  执行功能', 'page': 10}, {'label': '4.  中文学习', 'page': 11}, {'label': '5.  数学学习', 'page': 12}, {'label': '6.  英文学习', 'page': 14}]}]";
//            JSONArray defaultArray = JSON.parseArray(defaultCover);
//            context.setVariable("titleInfo", defaultArray);
//            context.setVariable("pageFooter", "第1页/共23页");
//            String htmlStr = templateEngine.process("pages/page2/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page3 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"3.pdf";
//            Context context = new Context();
//            context.setVariable("siteName", templateEntity.getSiteName());
//            context.setVariable("pageFooter", "第2页/共23页");
//            String htmlStr = templateEngine.process("pages/page3/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page4 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"4.pdf";
//            Context context = new Context();
//            context.setVariable("pageFooter", "第3页/共23页");
//            String htmlStr = templateEngine.process("pages/page4/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page5AndPage6 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"5.pdf";
//            Context context = new Context();
//            // 报告 结果摘要 文案：
//            List<MriTextVM> mriTexts = templateEntity.getMriTexts();
//            List<MriTextVM> collect = mriTexts.stream().filter(m -> MRI_RESULT_ABSTRACT.equals(m.getTitle())).collect(Collectors.toList());
//            if(!CollectionUtils.isEmpty(collect) && Objects.nonNull(collect.get(0))){
//                context.setVariable("mriResult", collect.get(0).getTextValue());
//            }
//            // 报告 分数等级列表：
//            List<TemplateEntity.ScoreEntity> scoreList = templateEntity.getScoreListMap();
//            // 返回给page6展示的列表
//            List<TemplateEntity.ScoreEntity> res = new ArrayList<>();
//            if(!CollectionUtils.isEmpty(scoreList)){
//                Map<String, List<TemplateEntity.ScoreEntity>> taskGroupMap = scoreList.stream().collect(Collectors.groupingBy(TemplateEntity.ScoreEntity::getTaskGroupId));
//                List<TemplateEntity.ScoreEntity> cognitionStudy = taskGroupMap.get(COGNITION_STUDY);
//                List<TemplateEntity.ScoreEntity> emotionSocialAdapt = taskGroupMap.get(EMOTION_SOCIAL_ADAPT);
//                //page5 只处理 15 条数据，如果有多的，给 page6 处理
//                int size = 15 - cognitionStudy.size();
//                List<List<TemplateEntity.ScoreEntity>> partition = Lists.partition(emotionSocialAdapt, size);
//                List<TemplateEntity.ScoreEntity> emotionSocialAdaptPage5 = partition.get(0);
//                if(partition.size()==2){
//                    res = partition.get(1);
//                }
//                JSONArray list1 = processScoreEntityList(cognitionStudy, 1);
//                JSONArray list2 = processScoreEntityList(emotionSocialAdaptPage5, 1);
//                context.setVariable("list1", list1);
//                context.setVariable("list2", list2);
//                context.setVariable("pageFooter", "第4页/共23页");
//                String htmlStr = templateEngine.process("pages/page5/index", context);
//                HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//            }
//            // page6 处理
//            if(res.size()>0){
//                String pdfPath6 = pdfRootPath + CONCAT +"6.pdf";
//                Context context6 = new Context();
//                JSONArray list6 = processScoreEntityList(res, 1);
//                context6.setVariable("list", list6);
//                context6.setVariable("pageFooter", "第5页/共23页");
//                String htmlStr6 = templateEngine.process("pages/page6/index", context6);
//                HtmlToPdfUtils.convertStringToPdf(htmlStr6, pdfPath6);
//            }
//        }
//    }
//
//    public class Page7 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"7.pdf";
//            Context context = new Context();
//            context.setVariable("pageFooter", "第6页/共23页");
//            String htmlStr = templateEngine.process("pages/page7/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page8 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"8.pdf";
//            Context context = new Context();
//            //todo 脑图路径：
//            Map<String, String> brainImageMap = templateEntity.getBrainImageMap();
//            String imgList = processBrainImageMap(brainImageMap, prefixPath);
//            // String imgList = "[{'imgUrl':'','label':'左视图'},{'imgUrl':'','label':'顶视图'},{'imgUrl':'','label':'右视图'}]";
//            context.setVariable("imgList", JSON.parseArray(imgList));
//
//            //文案设置：
//            List<MriTextVM> mriTexts = templateEntity.getMriTexts();
//            Map<String, MriTextVM> mriTextVMMap = mriTexts.stream().collect(Collectors.toMap(MriTextVM::getTitle, m -> m, (k1, k2) -> k1));
//            if(mriTextVMMap.containsKey(MRI_RESULT_VIEW)){
//                String mriResult1 = mriTextVMMap.get(MRI_RESULT_VIEW).getTextValue();
//                context.setVariable("mriResult1",mriResult1);
//            }
//            if(mriTextVMMap.containsKey(MRI_RESULT_BRAIN)){
//                String mriResult2 = mriTextVMMap.get(MRI_RESULT_BRAIN).getTextValue();
//                context.setVariable("mriResult2",mriResult2);
//            }
//            context.setVariable("pageFooter", "第7页/共23页");
//            String htmlStr = templateEngine.process("pages/page8/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page9 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"9.pdf";
//            Context context = new Context();
//            context.setVariable("pageFooter", "第8页/共23页");
//            String htmlStr = templateEngine.process("pages/page9/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page10 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"10.pdf";
//            Context context = new Context();
//            context.setVariable("pageFooter", "第9页/共23页");
//            //绘制柱状图
//            generateEChart(scoreEntityMap, pdfRootPath);
//            String htmlStr = templateEngine.process("pages/page10/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page11 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"11.pdf";
//            Context context = new Context();
//            if(!CollectionUtils.isEmpty(scoreEntityMap)){
//                TemplateEntity.ScoreEntity spaceWork = scoreEntityMap.get("space-work"); // 空间工作记忆
//                TemplateEntity.ScoreEntity episodicMemory = scoreEntityMap.get("episodic-memory"); // 情景记忆
//                context.setVariable("spaceWork", processScoreEntity(spaceWork,colorMap,false));
//                context.setVariable("episodicMemory", processScoreEntity(episodicMemory,colorMap,false));
//            }
//            context.setVariable("pageFooter", "第10页/共23页");
//            String htmlStr = templateEngine.process("pages/page11/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page12 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"12.pdf";
//            Context context = new Context();
//            if(!CollectionUtils.isEmpty(scoreEntityMap)){
//                TemplateEntity.ScoreEntity performingFunction = scoreEntityMap.get("performing-function"); // 执行能力
//                context.setVariable("performingFunction", processScoreEntity(performingFunction,colorMap,false));
//                // 识字量、句子阅读理解、朗读流畅性
//                List<TemplateEntity.ScoreEntity> scoreEntityList = new ArrayList<>();
//                scoreEntityList.add(scoreEntityMap.get("word-count"));
//                scoreEntityList.add(scoreEntityMap.get("sentence-understand"));
//                scoreEntityList.add(scoreEntityMap.get("read-fluency"));
//                JSONArray jsonArray = processScoreEntityList(scoreEntityList, 2);
//                context.setVariable("list", jsonArray);
//            }
//            context.setVariable("pageFooter", "第11页/共23页");
//            String htmlStr = templateEngine.process("pages/page12/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page13 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"13.pdf";
//            Context context = new Context();
//            JSONObject wordCount = processScoreEntity(scoreEntityMap.get("word-count"), colorMap, true);
//            JSONObject sentenceUnderstand = processScoreEntity(scoreEntityMap.get("sentence-understand"), colorMap, true);
//            JSONObject readFluency = processScoreEntity(scoreEntityMap.get("read-fluency"), colorMap, true);
//            JSONArray jsonArray = new JSONArray();
//            jsonArray.add(wordCount);jsonArray.add(sentenceUnderstand);jsonArray.add(readFluency);
//            context.setVariable("list", jsonArray);
//            context.setVariable("pageFooter", "第12页/共23页");
//            String htmlStr = templateEngine.process("pages/page13/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page14 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"14.pdf";
//            Context context = new Context();
//            TemplateEntity.ScoreEntity mathOperation = scoreEntityMap.get("math-operation");// 数学运算
//            TemplateEntity.ScoreEntity conceptUnderstand = scoreEntityMap.get("concept-understand"); // 概念理解
//            TemplateEntity.ScoreEntity applicationSolve = scoreEntityMap.get("application-problem-solving"); // 应用题解决
//
//            List<TemplateEntity.ScoreEntity> scoreEntities = new ArrayList<>();
//            scoreEntities.add(mathOperation);
//            scoreEntities.add(conceptUnderstand);
//            scoreEntities.add(applicationSolve);
//            JSONArray list1 = processScoreEntityList(scoreEntities, 2);
//            JSONObject mathOperationJo = processScoreEntity(mathOperation, colorMap, true);
//            JSONObject conceptUnderstandJo = processScoreEntity(conceptUnderstand, colorMap, true);
//            //JSONObject applicationSolveJo = processScoreEntity(applicationSolve, colorMap, true);
//            JSONArray jsonArray = new JSONArray();
//            jsonArray.add(mathOperationJo);jsonArray.add(conceptUnderstandJo);
//            //jsonArray.add(applicationSolveJo);
//            context.setVariable("list1", list1);
//            // 判断list2.size() 返回前两条，第三条在page15展示
//            context.setVariable("list2", jsonArray);
//            context.setVariable("pageFooter", "第13页/共23页");
//            String htmlStr = templateEngine.process("pages/page14/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page15 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"15.pdf";
//            Context context = new Context();
//            TemplateEntity.ScoreEntity applicationSolve = scoreEntityMap.get("application-problem-solving"); // 应用题解决
//            JSONObject applicationSolveJo = processScoreEntity(applicationSolve, colorMap, true);
//            JSONArray list1 = new JSONArray();
//            list1.add(applicationSolveJo);
//
//            TemplateEntity.ScoreEntity letterNaming = scoreEntityMap.get("letter-naming"); // 字母快速命名
//            TemplateEntity.ScoreEntity englishOrthographic = scoreEntityMap.get("english-orthographic"); // 英文正字法
//            List<TemplateEntity.ScoreEntity> scoreEntities = new ArrayList<>();
//            scoreEntities.add(letterNaming);
//            scoreEntities.add(englishOrthographic);
//            JSONArray list2 = processScoreEntityList(scoreEntities, 2);
//
//            //没有第三条返回空list
//            context.setVariable("list1", list1);
//            context.setVariable("list2", list2);
//            context.setVariable("pageFooter", "第14页/共23页");
//            String htmlStr = templateEngine.process("pages/page15/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page16 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"16.pdf";
//            Context context = new Context();
//            TemplateEntity.ScoreEntity letterNaming = scoreEntityMap.get("letter-naming"); // 应用题解决
//            TemplateEntity.ScoreEntity englishOrthographic = scoreEntityMap.get("english-orthographic"); // 应用题解决
//            JSONObject letterNamingJo = processScoreEntity(letterNaming, colorMap, true);
//            JSONObject englishOrthographicJo = processScoreEntity(englishOrthographic, colorMap, true);
//            JSONArray list1 = new JSONArray();
//            if(Objects.nonNull(letterNamingJo)) list1.add(letterNamingJo);
//            if(Objects.nonNull(englishOrthographicJo)) list1.add(englishOrthographicJo);
//            context.setVariable("list", list1);
//            context.setVariable("pageFooter", "第15页/共23页");
//            String htmlStr = templateEngine.process("pages/page16/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page17 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"17.pdf";
//            Context context = new Context();
//            //一、二年级显示情绪调节状态，其余年级这里是“情绪状态、情绪调节策略、
//            String textData = "情绪调节状态";
//            if(grade>2){
//                textData = "情绪状态、情绪调节策略";
//            }
//            context.setVariable("textData", textData);
//            context.setVariable("pageFooter", "第16页/共23页");
//            String htmlStr = templateEngine.process("pages/page17/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page18 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            //1-2年级没有这一页  3-12年级
//            if(grade<3) return;
//            String pdfPath = pdfRootPath + CONCAT +"18.pdf";
//            Context context = new Context();
//
//            List<TemplateEntity.ScoreEntity> scoreEntities = new ArrayList<>();
//            TemplateEntity.ScoreEntity positiveEmo = scoreEntityMap.get("positive-emotion");
//            TemplateEntity.ScoreEntity negativeEmo = scoreEntityMap.get("negative-emotion");
//            scoreEntities.add(positiveEmo);
//            scoreEntities.add(negativeEmo);
//            JSONArray list = processScoreEntityList(scoreEntities, 3);
//            /*JSONObject positiveEmoJo = processScoreEntity(positiveEmo, colorMap, true);
//            JSONObject negativeEmoJo = processScoreEntity(negativeEmo, colorMap, true);
//            JSONArray list = new JSONArray();
//            if(Objects.nonNull(positiveEmoJo)) list.add(positiveEmoJo);
//            if(Objects.nonNull(negativeEmoJo)) list.add(negativeEmoJo);*/
//            String tip = tipMap.get("positive-negative");
//            context.setVariable("list", list);
//            context.setVariable("tip", tip);
//            context.setVariable("pageFooter", "第17页/共23页");
//            String htmlStr = templateEngine.process("pages/page18/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page19 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"19.pdf";
//            Context context = new Context();
//            //1-2年级  3-12年级 pageData不一样
//            //1-2年级，蛋糕任务；3-12年级，认知重评和表达抑制
//            JSONArray list = new JSONArray();
//            String pageData = "";
//            List<TemplateEntity.ScoreEntity> scoreEntities = new ArrayList<>();
//
//            if(grade>2){
//                pageData = "{'title':'2：情绪调节策略','info':'情绪调节策略是儿童青少年在处理情绪时所采用的方法和技巧，类似于情绪的“应对方式”。具体来说，情绪调节策略包括认知重评和表达抑制。当儿童青少年学会有效的情绪管理技巧时，可以更好地理解和掌控自己的情绪，提高自尊心和社交能力，避免过度焦虑或沮丧。','subTitle':'情绪调节策略'}";
//                TemplateEntity.ScoreEntity cognitiveReap = scoreEntityMap.get("cognitive-reap");
//                TemplateEntity.ScoreEntity expressionInhibition = scoreEntityMap.get("expression-inhibition");
//                scoreEntities.add(cognitiveReap);
//                scoreEntities.add(expressionInhibition);
//            }else {
//                pageData = "{'title':'1：情绪调节','info':'情绪调节是儿童青少年在处理情绪时所采用的方法和技巧，类似于情绪的“应对方式”。情绪调节良好的儿童可以根据环境的需要及时调整自己的情绪，但又不会让情绪起伏过度强烈。当儿童青少年学会有效的情绪管理技巧时，可以更好地理解和掌控自己的情绪，提高自尊心和社交能力，避免过度焦虑或沮丧。','subTitle':'情绪调节表现'}";
//                //1-2年级，蛋糕任务；3-12年级，认知重评和表达抑制
//                TemplateEntity.ScoreEntity emoAdjust = scoreEntityMap.get("emo-adjust");
//                scoreEntities.add(emoAdjust);
//            }
//
//            list = processScoreEntityList(scoreEntities, 3);
//            String tip = tipMap.get("emotional-regulation");
//
//            context.setVariable("pageData", JSON.parseObject(pageData));
//            context.setVariable("list", list);
//            context.setVariable("tip", tip);
//            context.setVariable("pageFooter", "第18页/共23页");
//            String htmlStr = templateEngine.process("pages/page19/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page20 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"20.pdf";
//            Context context = new Context();
//            //1-2年级 = 2 3-12年级 = 3
//            String num = grade<3?"2":"3";
//            //亲社会取向 forward.png  亲个人取向 negative.png
//            TemplateEntity.ScoreEntity socialValue = scoreEntityMap.get("social-value");
//            String level = socialValue.getLevel();
//            String imgSrc = "亲社会取向".equals(level)?"forward.png":"negative.png";
//            JSONObject jsonObject = new JSONObject();
//            jsonObject.put("value",level);
//            jsonObject.put("info",socialValue.getLevelInfo());
//            jsonObject.put("src",imgSrc);
//            String tip = tipMap.get("social-value");
//            context.setVariable("num", num);
//            context.setVariable("item", jsonObject);
//            context.setVariable("tip", tip);
//            context.setVariable("pageFooter", "第19页/共23页");
//            String htmlStr = templateEngine.process("pages/page20/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page21 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"21.pdf";
//            Context context = new Context();
//            //1-2年级 = 3 3-12年级 = 4
//            String num = grade<3?"3":"4";
//            //String num = "4";
//            String equipmentInfo = "[{'imgName':'1.png','desc':'','slot':true},{'imgName':'2.png','desc':'信息咨讯的每周使用时间','prop':'infomation'}," +
//                    "{'imgName':'3.png','desc':'聊天交流的每周使用时间','prop':'chat'},{'imgName':'4.png','desc':'电视电影的每周使用时间','prop':'tvAndMovie'}," +
//                    "{'imgName':'5.png','desc':'音乐广播的每周使用时间','prop':'musicAndBroadcast'},{'imgName':'6.png','desc':'小说漫画的每周使用时间','prop':'novelAndComic'}," +
//                    "{'imgName':'7.png','desc':'辅助作业的每周使用时间','prop':'homework'},{'imgName':'8.png','desc':'社交媒体的每周使用时间','prop':'socialMedia'},]";
//            Map<String, String> equipmentData = new HashMap<>();
//            if(!CollectionUtils.isEmpty(electroicDeviceUseMap)){
//                equipmentData.put("hasDevice",electroicDeviceUseMap.get("hasDevice"));
//                equipmentData.put("age",electroicDeviceUseMap.get("age"));
//                equipmentData.put("chat",electroicDeviceUseMap.get("chat"));
//                equipmentData.put("tvAndMovie",electroicDeviceUseMap.get("tvAndMovie"));
//                equipmentData.put("musicAndBroadcast",electroicDeviceUseMap.get("musicAndBroadcast"));
//                equipmentData.put("novelAndComic",electroicDeviceUseMap.get("novelAndComic"));
//                equipmentData.put("homework",electroicDeviceUseMap.get("homework"));
//                equipmentData.put("socialMedia",electroicDeviceUseMap.get("socialMedia"));
//            }else {
//                equipmentData.put("hasDevice","暂无数据");
//                equipmentData.put("age","暂无数据");
//                equipmentData.put("chat","暂无数据");
//                equipmentData.put("tvAndMovie","暂无数据");
//                equipmentData.put("musicAndBroadcast","暂无数据");
//                equipmentData.put("novelAndComic","暂无数据");
//                equipmentData.put("homework","暂无数据");
//                equipmentData.put("socialMedia","暂无数据");
//            }
//            context.setVariable("num", num);
//            context.setVariable("equipmentInfo", JSON.parseArray(equipmentInfo));
//            context.setVariable("equipmentData", equipmentData);
//            context.setVariable("pageFooter", "第20页/共23页");
//            String htmlStr = templateEngine.process("pages/page21/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page22 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"22.pdf";
//            Context context = new Context();
//            String equipmentInfo = "[{'imgName':'9.png','desc':'评论留言的每周使用时间','prop':'comment'}," +
//                    "{'imgName':'10.png','desc':'自媒体运营的每周使用时间','prop':'selfMedia'},{'imgName':'11.png','desc':'网络直播的每周使用时间','prop':'live'}," +
//                    "{'imgName':'12.png','desc':'电子购物的每周使用时间','prop':'shopping'},{'imgName':'13.png','desc':'电子游戏的每周使用时间','prop':'gaming'}," +
//                    "{'imgName':'','desc':'','prop':''},]";
//            Map<String, String> equipmentData = new HashMap<>();
//            String tip = tipMap.get("electronic-devices");
//            if(!CollectionUtils.isEmpty(electroicDeviceUseMap)){
//                equipmentData.put("comment",electroicDeviceUseMap.get("comment"));
//                equipmentData.put("selfMedia",electroicDeviceUseMap.get("selfMedia"));
//                equipmentData.put("live",electroicDeviceUseMap.get("live"));
//                equipmentData.put("shopping",electroicDeviceUseMap.get("shopping"));
//                equipmentData.put("gaming",electroicDeviceUseMap.get("gaming"));
//            }else {
//                equipmentData.put("comment","暂无数据");
//                equipmentData.put("selfMedia","暂无数据");
//                equipmentData.put("live","暂无数据");
//                equipmentData.put("shopping","暂无数据");
//                equipmentData.put("gaming","暂无数据");
//            }
//            context.setVariable("equipmentInfo", JSON.parseArray(equipmentInfo));
//            context.setVariable("equipmentData", electroicDeviceUseMap);
//            context.setVariable("pageFooter", "第21页/共23页");
//            context.setVariable("tip", tip);
//            String htmlStr = templateEngine.process("pages/page22/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page23 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"23.pdf";
//            Context context = new Context();
//            context.setVariable("pageFooter", "第22页/共23页");
//            String htmlStr = templateEngine.process("pages/page23/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    public class Page24 implements PageImpl{
//        @Override
//        public void generate() throws IOException {
//            String pdfPath = pdfRootPath + CONCAT +"24.pdf";
//            Context context = new Context();
//            String tip = tipMap.get("popular-science");
//            context.setVariable("tip", tip);
//            context.setVariable("siteName", templateEntity.getSiteName());
//            context.setVariable("pageFooter", "第23页/共23页");
//            String htmlStr = templateEngine.process("pages/page24/index", context);
//            HtmlToPdfUtils.convertStringToPdf(htmlStr, pdfPath);
//        }
//    }
//
//    /**
//     * 异步方式，生成一页PDF
//     * @param page
//     * @param executorService
//     */
//    private CompletableFuture<Void> asyncGenerateSinglePage(PageImpl page,TaskExecutor executorService){
//        CompletableFuture<Void> cf = CompletableFuture.runAsync(() -> {
//            try {
//                long tt1 = System.currentTimeMillis();
//                page.generate();
//                long tt2 = System.currentTimeMillis();
//                log.info(templateEntity.getSubjectName() +", 页码："+String.valueOf(page.getClass()) + ", 耗时 : {}",tt2-tt1);
//            } catch (IOException e) {
//                log.info(e.getMessage());
//                throw new RuntimeException(e);
//            }
//        }, executorService);
//        return cf;
//    }
//
//    private void generateAndMerge(String fileName,TaskExecutor executorService) throws Exception {
//        List<CompletableFuture<Void>> futures = new ArrayList<>();
//        // 所有类和接口
//        Class<?>[] declaredClasses = ReportPdf.class.getDeclaredClasses();
//        List<Class<? >> classList = Arrays.stream(declaredClasses).filter(m->!m.isInterface()).collect(Collectors.toList());
//        for (Class clazz : classList){
//            // 由于成员内部类对象的创建依赖于外部类对象，没有无参构造函数
//            // 在反射构造成员内部类的时候要传入外部类的Class和实例
//            Constructor constructor = clazz.getConstructor(ReportPdf.class);
//            PageImpl p =(PageImpl) constructor.newInstance(this);
//            CompletableFuture<Void> cf = asyncGenerateSinglePage(p, executorService);
//            futures.add(cf);
//        }
//
//        CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).join();
//        // 把以上pdf合成一个
//        pdfMerge(fileName);
//    }
//
//
//    public File buildPdf(){
//        List<TemplateEntity.ScoreEntity> scoreList = templateEntity.getScoreListMap();
//        if(!CollectionUtils.isEmpty(scoreList)){
//            scoreEntityMap = scoreList.stream().collect(Collectors.toMap(TemplateEntity.ScoreEntity::getTestId, m -> m, (k1, k2) -> k1));
//        }
//
//        List<TemplateConfig> tips = templateEntity.getTips();
//        if(!CollectionUtils.isEmpty(tips)){
//            tipMap = tips.stream().collect(Collectors.toMap(TemplateConfig::getKey, TemplateConfig::getValue, (k1, k2) -> k1));
//        }
//
//        List<ElectroicUseVM> electroicDeviceUse = templateEntity.getElectroicDeviceUseMap();
//        if(!CollectionUtils.isEmpty(electroicDeviceUse)){
//            electroicDeviceUseMap = electroicDeviceUse.stream().collect(Collectors.toMap(ElectroicUseVM::getMetricId,ElectroicUseVM::getValue,(k1,k2)->k1));
//        }
//
//        String fileName = "中国学龄儿童脑智发育队列研究项目-"+templateEntity.getSiteName()+"测试结果反馈报告【试行版】_"+templateEntity.getSubjectId()+"_"+
//                LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))+PDF_SUFFIX;
//        try {
//            // 如果不存在，就创建路径：
//            File pdfRootPathFile = new File(pdfRootPath);
//            if (!pdfRootPathFile.exists()) {
//                pdfRootPathFile.mkdirs();
//            }
//            // 先删除路径下所有文件
//            deleteAllFilesInDirectory(pdfRootPathFile);
//
//            long t1 = System.currentTimeMillis();
//            generateAndMerge(fileName,taskExecutor);
//            long t2 = System.currentTimeMillis();
//            log.info("t2-t1:{}",t2-t1);
//            // 备份代码在 : C:\Users\haochen50\Documents\文档\个人\Untitled-6.java
//        }catch (IOException ioException){
//            ioException.printStackTrace();
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }
//        return new File(pdfRootPath + CONCAT + fileName );
//    }
//
//
//    /**
//     * 获取去掉后缀的文件名，转为数字，以方便排序
//     * @param file
//     * @return
//     */
//    public static int getFileNameWithoutExtension(File file) {
//        String fileName = file.getName();
//        int lastIndexOfDot = fileName.lastIndexOf('.');
//        if (lastIndexOfDot != -1) {
//            fileName = fileName.substring(0, lastIndexOfDot);
//        }
//        return Integer.parseInt(fileName);
//    }
//
//    public void pdfMerge(String fileName) throws Exception {
//        File pdfDirectory = new File(pdfRootPath);
//        File[] pdfFiles = pdfDirectory.listFiles((dir, name) -> name.endsWith(".pdf"));
//
//        // 对PDF文件进行排序
//        if (pdfFiles != null && pdfFiles.length > 0) {
//            Arrays.sort(pdfFiles, Comparator.comparing(ReportPdf::getFileNameWithoutExtension));
//
//            // 创建一个新的PDF文档
//            PDDocument mergedPDF = new PDDocument();
//
//            // 将排序后的PDF文件逐个添加到新的PDF文档中
//            for (File pdfFile : pdfFiles) {
//                try {
//                    PDDocument document = PDDocument.load(pdfFile);
//                    PDFMergerUtility merger = new PDFMergerUtility();
//                    merger.appendDocument(mergedPDF,document);
//                    merger.setDestinationFileName(pdfFile.getName() + "_merged.pdf");
//                    merger.mergeDocuments(null);
//                    document.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//
//            // 保存新的PDF文档
//            try {
//                mergedPDF.save(pdfRootPath + CONCAT + fileName);
//                mergedPDF.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }else {
//            throw BpException.badRequest(FeedbackExceptions.PDF_FILES_EMPTY);
//        }
//    }
//
//
//    /**
//     * 处理scoreEntityList,得到对应的字符串在thymeleaf模板中使用
//     * @param scoreEntityList
//     * @param type  区分不同场景，需要不同字段; 1: score  2: content 3:score&content
//     * @return
//     */
//    private static JSONArray processScoreEntityList(List<TemplateEntity.ScoreEntity> scoreEntityList,int type){
//        if(CollectionUtils.isEmpty(scoreEntityList)){
//            throw BpException.badRequest(FeedbackExceptions.SCORE_ENTITY_LIST_EMPTY);
//        }
//        JSONArray array = new JSONArray();
//        for(TemplateEntity.ScoreEntity entity : scoreEntityList){
//            if(Objects.isNull(entity)) continue;
//            JSONObject jsonObject = new JSONObject();
//            jsonObject.put("testName",entity.getTestName());
//            if(type == 1){
//                jsonObject.put("score",entity.getScore());
//            }else if(type == 2){
//                jsonObject.put("content",entity.getContent());
//            }else if(type == 3){
//                jsonObject.put("score",entity.getScore());
//                jsonObject.put("content",entity.getContent());
//            }
//            jsonObject.put("level", StringUtils.isNotBlank(entity.getLevel())?entity.getLevel():"暂无数据");
//            array.add(jsonObject);
//        }
//        return array;
//    }
//
//    private static String processBrainImageMap(Map<String,String> brainImageMap,String prefixPath){
//        /*if(CollectionUtils.isEmpty(brainImageMap)){
//            throw BpException.badRequest(FeedbackExceptions.BRAIN_IAMGE_MAP_EMPTY);
//        }*/
//        JSONArray array = new JSONArray();
//
//        brainImageMap.forEach((k,v)->{
//            JSONObject jsonObject = new JSONObject();
//            jsonObject.put("imgUrl",prefixPath+CONCAT+v);
//            jsonObject.put("label",k);
//            array.add(jsonObject);
//        });
//        return array.toString();
//    }
//
//    /**
//     * 处理scoreEntity，得到报告第二部分中各项任务的“表现”
//     * @param scoreEntity
//     * @param colorMap 颜色
//     * @param needTestName 是否需要 testName 属性
//     * @return
//     */
//    private static JSONObject processScoreEntity(TemplateEntity.ScoreEntity scoreEntity,
//                                                 Map<String,String> colorMap,boolean needTestName){
//        JSONObject jsonObject = new JSONObject();
//        if(Objects.isNull(scoreEntity)) return null;
//
//        if(needTestName){
//            jsonObject.put("testName",scoreEntity.getTestName());
//        }
//        jsonObject.put("levelInfo",scoreEntity.getLevelInfo());
//        jsonObject.put("color",colorMap.get(scoreEntity.getLevel()));
//        if(Objects.nonNull(scoreEntity.getLevel())){
//            switch (scoreEntity.getLevel()){
//                case "A":
//                    jsonObject.put("level","优秀");
//                    break;
//                case "B":
//                    jsonObject.put("level","良好");
//                    break;
//                case "C":
//                    jsonObject.put("level","中等");
//                    break;
//                default:
//                    jsonObject.put("level","待提升");
//                    break;
//            }
//        }else {
//            jsonObject.put("level","暂无数据");
//        }
//
//        return jsonObject;
//    }
//
//    /**
//     * 删除目录下所有文件
//     * @param directory
//     */
//    public static void deleteAllFilesInDirectory(File directory) {
//        if (directory.isDirectory()) {
//            File[] files = directory.listFiles();
//            if (files != null) {
//                for (File file : files) {
//                    deleteAllFilesInDirectory(file);
//                }
//            }
//        }
//        directory.delete();
//    }
//
//    /**
//     * 生成柱状图
//     */
//    private void generateEChart(Map<String, TemplateEntity.ScoreEntity> scoreEntityMap, String pdfRootPath){
//        GsonOption option = new GsonOption();
//        option.backgroundColor("#FCFCFC");
//        option.title().text("").left("center").textStyle().color("#5E6570").fontWeight("normal").fontSize(10);
//
//        CategoryAxis xAxis = new CategoryAxis();
//        xAxis.data("空间工作记忆","情景记忆","执行能力","识字量","句子阅读理解","朗读流畅性","应用题解决","概念理解","数学运算","字母快速命名","英语正字法意识");
//        AxisLabel axisLabel = new AxisLabel();
//        axisLabel.interval(0);
//        axisLabel.rotate(45);
//        xAxis.axisLabel(axisLabel);
//        option.xAxis(xAxis);
//
//        ValueAxis yAxis = new ValueAxis();
//        yAxis.setMin(0);
//        yAxis.setMax(4);
//        yAxis.interval(1);
//        option.yAxis(yAxis);
//
//        Bar bar = new Bar();
//        bar.name("认知与学习表现总览");
//        bar.barWidth(12);
//
//        Integer[] dataList = new Integer[11];
//        for(int i = 0; i<TEST_IDS.length; i++){
//            TemplateEntity.ScoreEntity scoreEntity = scoreEntityMap.get(TEST_IDS[i]);
//            if(Objects.nonNull(scoreEntity) && Objects.nonNull(scoreEntity.getLevel())){
//                dataList[i]= 4- (scoreEntity.getLevel().charAt(0) - 'A'); //  A:4 B:3 C:2 D:1
//            }else {
//                dataList[i]= 0;
//            }
//        }
//
//       // Integer[] dataList = {0, 1, 4, 0, 0, 0, 1, 1, 1, 0, 0};
//        String[] colorList = {"#2cc7ed", "#f99444", "#27ce91", "#9473e8"};
//        for (int i = 0; i < dataList.length; i++) {
//            JSONObject data = new JSONObject();
//            JSONObject color = new JSONObject();
//            data.put("value",dataList[i]);
//            data.put("itemStyle", color);
//            if(i < 3) {
//                color.put("color",colorList[0]);
//            } else if (i < 6) {
//                color.put("color",colorList[1]);
//            } else if (i < 9) {
//                color.put("color",colorList[2]);
//            } else {
//                color.put("color",colorList[3]);
//            }
//            bar.data(data);
//        }
//        option.series(bar);
//
//        Grid grid = new Grid();
//        grid.bottom("3%");
//        grid.containLabel(true);
//        option.grid(grid);
//
//        // System.out.println(option);
//
//        try {
//            PhantomJsUtils.genEChart(option.toString(),pdfRootPath+CONCAT,1095,732);
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//    }
//}
